#ifndef SYNC_MANAGER_H
#define SYNC_MANAGER_H

#include <QObject>
#include <QString>
#include <QMap>
#include <QByteArray>
#include <QDateTime>
#include <QTimer>

namespace CollaborativeDesign {

// 同步状态枚举
enum class SyncStatus {
    Idle,           // 空闲
    Syncing,        // 同步中
    Conflict,       // 冲突
    Error           // 错误
};

// 同步项结构
struct SyncItem {
    QString filePath;        // 文件路径
    QByteArray hash;         // 文件哈希
    QDateTime lastSync;      // 最后同步时间
    QDateTime lastModified;  // 最后修改时间
    SyncStatus status;       // 同步状态
};

// 数据同步管理器类
class SyncManager : public QObject
{
    Q_OBJECT

public:
    SyncManager();
    ~SyncManager();

    // 初始化同步管理器
    bool initialize(const QString& syncDir);
    
    // 添加同步文件
    bool addSyncFile(const QString& filePath);
    
    // 移除同步文件
    bool removeSyncFile(const QString& filePath);
    
    // 获取同步状态
    SyncStatus getSyncStatus(const QString& filePath);
    
    // 手动触发同步
    bool syncNow(const QString& filePath = QString());
    
    // 解决冲突
    bool resolveConflict(const QString& filePath, bool useLocal);
    
    // 获取所有同步项
    QList<SyncItem> getAllSyncItems();
    
    // 设置自动同步间隔（秒）
    void setAutoSyncInterval(int seconds);
    
    // 启用/禁用自动同步
    void setAutoSync(bool enable);

signals:
    // 同步开始信号
    void syncStarted(const QString& filePath);
    
    // 同步完成信号
    void syncCompleted(const QString& filePath, bool success);
    
    // 同步状态变更信号
    void syncStatusChanged(const QString& filePath, SyncStatus status);
    
    // 冲突检测信号
    void conflictDetected(const QString& filePath);

private slots:
    // 自动同步定时器触发
    void onAutoSyncTimer();
    
    // 文件变更监控
    void onFileChanged(const QString& filePath);

private:
    // 计算文件哈希
    QByteArray calculateFileHash(const QString& filePath);
    
    // 检查文件是否变更
    bool isFileChanged(const QString& filePath);
    
    // 上传文件
    bool uploadFile(const QString& filePath);
    
    // 下载文件
    bool downloadFile(const QString& filePath);
    
    // 检测冲突
    bool detectConflict(const QString& filePath);
    
    // 增量同步
    bool incrementalSync(const QString& filePath);
    
    // 初始化文件监控
    void initFileWatcher();

private:
    QMap<QString, SyncItem> m_syncItems;     // 同步项映射表
    QString m_syncDir;                       // 同步目录
    QTimer m_autoSyncTimer;                  // 自动同步定时器
    int m_autoSyncInterval;                  // 自动同步间隔（秒）
    bool m_autoSyncEnabled;                  // 是否启用自动同步
    QString m_serverUrl;                     // 服务器URL
};

} // namespace CollaborativeDesign

#endif // SYNC_MANAGER_H 